package com.itqf.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @Description:  spring另一种实现了aop的方式
 * @Company: 千锋互联
 * @Author: 李丽婷
 * @Date: 2020/11/11
 * @Time: 上午9:50
 */
@Component
@Aspect   //  xml  <aop:aspect>
public class MyAspect {

    @Pointcut(value = "execution(* com.itqf.service.impl.*.*(..))")//<aop:pointcut id="" exepression="execution()">
    public  void  myPointcut(){
    }

    /**
     * 前置增强
     * @param joinPoint  spring的aspectj包里提供了一个类，能获得被代理类运行时的信息（类名，方法名 参数， 返回值类型等）
     */
    @Before("myPointcut()")//<aop:before>
    public  void  before(JoinPoint joinPoint){//如何得到被代理对象的方法
        /**
         * joinPoint.getTarget()得到目标类 com.itqf.service.impl.GoodsServiceImpl
         * joinPoint.getSignature().getName()  目标方法名addGoods
         * Arrays.toString(joinPoint.getArgs())  参数  [张三]
         *
         *
         */
        System.out.println("前置增强....."+joinPoint.getTarget()+"--"+joinPoint.getSignature().getName()+
               "---"+ Arrays.toString(joinPoint.getArgs())+"---"+joinPoint.getKind());

    }


    @After("myPointcut()")
    public   void  after(){
        System.out.println("后置增强.....");
    }

    /**
     * 环绕通知必须使用：ProceedingJoinPoint  提供了调用目标方法的函数
     * @param proceedingJoinPoint
     */
    @Around("myPointcut()")
    public   Object  around(ProceedingJoinPoint proceedingJoinPoint){
        System.out.println("环绕----前置增强.....");

        Object   result = null;
        long start = System.currentTimeMillis();
        try {
            //调用目标方法
            result = proceedingJoinPoint.proceed();

            long end = System.currentTimeMillis();

            System.out.println(proceedingJoinPoint.getTarget().getClass()+"."+proceedingJoinPoint.getSignature().getName()
                    +"该方法的调用时间是："+(end-start)+"毫秒");

        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }

        System.out.println("环绕----后置增强....."+result);
        return  result;
    }

    @AfterThrowing(value = "myPointcut()",throwing = "throwable")
    public  void  exception(Throwable throwable){
        System.out.println("异常增强------"+throwable.getLocalizedMessage());
    }



}
